#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

#include "comunicacao_servidor.h"

#define MAXLINE 1000
#define MIN_SERV_PORT 49152

void trata_sigint(int signum);

/* Socket que sera' aberto (global para que
   possa ser acessado por tratador de sinal */
int sockfd_servidor;

int main(int argc, char **argv){
  int i;
  char nome[200], indice[2];
  unsigned short int serv_port;
  struct sockaddr_in servaddr;

  if (argc != 2){
    printf("Uso: servidor <Porta>\n");
    exit(1);
  }

  /* Testa se recebeu uma porta valida */
  serv_port = (unsigned short int)atoi(argv[1]);
  if(serv_port<MIN_SERV_PORT){
    printf("Numero de porta invalido. Deve ser pelo menos %d.\n", MIN_SERV_PORT);
    exit(1);
  }

  /* Tenta criar listening socket */
  if((sockfd_servidor = socket(AF_INET, SOCK_DGRAM, 0))==-1){
    printf("Erro na criacao do listening socket.\n");
    exit(1);
  }

  /* Inicializa estrutura 'servaddr' */
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
  servaddr.sin_port = htons(serv_port);

  /* Tenta fazer o bind com a porta */
  if(bind(sockfd_servidor, (struct sockaddr *) &servaddr, sizeof(servaddr))==-1){
    printf("Nao foi possivel fazer o bind com a porta pedida.\n");
    exit(1);
  }

  /* Inicializa banco de dados de filmes para consultas */
  Inicializa();

  /* Tratador para sinais de interrupcao */
  signal(SIGINT, trata_sigint);

  printf("Servidor inicializado com sucesso!\n");

#ifdef MARCAR_TEMPOS_SERVIDOR
  /* Abre arquivos para marcar tempos */
  indice[1] = '\0';
  for(i=0; i<NUM_CLIENTES; i++){
    portas[i] = 0;
    strcpy(nome, ARQ_TEMPO_SERVIDOR);
    indice[0] = 'a' + i;
    strcat(nome, indice);
    strcat(nome, EXT);
    fp_tempos_servidor[i] = fopen(nome, "w");
  }
#endif

  while(1){
    /* processa um pedido de um cliente */
    if(executa_sistema_servidor(sockfd_servidor)<0)
      printf("Erro na comunicacao com um cliente.\n");
  }

  return 0;
}

void trata_sigint(int signum){

#ifdef MARCAR_TEMPOS_SERVIDOR
  int i;
  /* Fecha arquivos de tempos */
  for(i=0; i<NUM_CLIENTES; i++)
    fclose(fp_tempos_servidor[i]);
#endif

  /* Fecha socket usado */
  close(sockfd_servidor);

  /* Libera memoria usada pelo banco de dados */
  Libera();

  printf("\n");

  exit(0);
}
